From cfc286601977ea2198193c7663315a936c6a9f42 Mon Sep 17 00:00:00 2001 From: Jonathan Blandford Date: Tue, 26 Oct 1999 03:42:14 +0000 Subject: [PATCH] started work on the loader --- gdk-pixbuf/Makefile.am | 4 +- gdk-pixbuf/gdk-pixbuf-loader.c | 190 +++++++++++++++++++++++++++++++++ gdk-pixbuf/gdk-pixbuf-loader.h | 79 ++++++++++++++ gdk-pixbuf/gdk-pixbuf.h | 2 + gtk/gdk-pixbuf-loader.c | 190 +++++++++++++++++++++++++++++++++ gtk/gdk-pixbuf-loader.h | 79 ++++++++++++++ 6 files changed, 543 insertions(+), 1 deletion(-) create mode 100644 gdk-pixbuf/gdk-pixbuf-loader.c create mode 100644 gdk-pixbuf/gdk-pixbuf-loader.h create mode 100644 gtk/gdk-pixbuf-loader.c create mode 100644 gtk/gdk-pixbuf-loader.h diff --git a/gdk-pixbuf/Makefile.am b/gdk-pixbuf/Makefile.am index 3671afd253..d9445d93d1 100644 --- a/gdk-pixbuf/Makefile.am +++ b/gdk-pixbuf/Makefile.am @@ -44,13 +44,15 @@ libgdk_pixbufincludedir = $(includedir)/gdk-pixbuf libgdk_pixbuf_la_SOURCES = \ gdk-pixbuf.c \ + gdk-pixbuf-loader.c \ gdk-pixbuf-io.c \ gdk-pixbuf-data.c libgdk_pixbuf_la_LDFLAGS = -version-info 1:0:0 libgdk_pixbufinclude_HEADERS = \ - gdk-pixbuf.h + gdk-pixbuf.h \ + gdk-pixbuf-loader.h # # The PNG plugin. diff --git a/gdk-pixbuf/gdk-pixbuf-loader.c b/gdk-pixbuf/gdk-pixbuf-loader.c new file mode 100644 index 0000000000..9dc57f45a1 --- /dev/null +++ b/gdk-pixbuf/gdk-pixbuf-loader.c @@ -0,0 +1,190 @@ +/* GdkPixbuf library - Main header file + * + * Copyright (C) 1999 The Free Software Foundation + * + * Authors: Mark Crichton + * Miguel de Icaza + * Federico Mena-Quintero + * Jonathan Blandford + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "gdk-pixbuf-loader.h" + + +static GtkObjectClass *parent_class; + +static void gdk_pixbuf_loader_class_init (GdkPixbufLoaderClass *klass); +static void gdk_pixbuf_loader_init (GdkPixbufLoader *loader); +static void gdk_pixbuf_loader_destroy (GdkPixbufLoader *loader); +static void gdk_pixbuf_loader_finalize (GdkPixbufLoader *loader); + +/* Internal data */ +typedef struct _GdkPixbufLoaderPrivate GdkPixbufLoaderPrivate; +struct _GdkPixbufLoaderPrivate +{ + GdkPixbuf *pixbuf; + gboolean closed; +}; + +GtkType +gdk_pixbuf_loader_get_type (void) +{ + static GtkType loader_type = 0; + + if (!loader_type) { + static const GtkTypeInfo loader_info = { + "GdkPixbufLoader", + sizeof (GdkPixbufLoader), + sizeof (GdkPixbufLoaderClass), + (GtkClassInitFunc) gdk_pixbuf_loader_class_init, + (GtkObjectInitFunc) gdk_pixbuf_loader_init, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL, + }; + + loader_type = gtk_type_unique (GTK_TYPE_OBJECT, &loader_info); + } + + return loader_type; +} + +static void +gdk_pixbuf_loader_class_init (GdkPixbufLoaderClass *klass) +{ + parent_class = GTK_OBJECT_CLASS (klass); + + parent_class->destroy = gdk_pixbuf_loader_destroy; + parent_class->finalize = gdk_pixbuf_loader_finalize; +} + +static void +gdk_pixbuf_loader_init (GdkPixbufLoader *loader) +{ + GdkPixbuf *pixbuf; + loader->private = g_new (GdkPixbufLoaderPrivate, 1); + + loader->pixbuf = NULL; + loader->closed = FALSE; +} + +static void +gdk_pixbuf_loader_destroy (GdkPixbufLoader *loader) +{ + GdkPixbufLoaderPrivate *priv; + + priv = loader->private; + gdk_pixbuf_unref (priv->pixbuf); +} + +static void +gdk_pixbuf_loader_finalize (GdkPixbufLoader *loader) +{ + GdkPixbufLoaderPrivate *priv; + + priv = loader->private; + g_free (priv); +} + +/* Public functions */ +GtkObject * +gdk_pixbuf_loader_new (void) +{ + GdkPixbufLoader *loader; + + loader = gtk_type_new (gdk_pixbuf_loader_get_type ()); + + return GTK_OBJECT (loader); +} + +/** + * gdk_pixbuf_loader_write: + * @loader: A loader. + * @buf: The image data. + * @count: The length of @buf in bytes. + * + * This will load the next @size bytes of the image. It will return TRUE if the + * data was loaded successfully, and FALSE if an error occurred. In this case, + * the loader will be closed, and will not accept further writes. + * + * Return value: Returns TRUE if the write was successful -- FALSE if the loader + * cannot parse the buf. + **/ +gboolean +gdk_pixbuf_loader_write (GdkPixbufLoader *loader, gchar *buf, size_t count) +{ + GdkPixbufLoaderPrivate *priv; + + g_return_val_if_fail (loader != NULL, FALSE); + g_return_val_if_fail (GDK_IS_PIXBUF_LOADER (loader), FALSE); + + priv = loader->private; + + /* we expect it's not to be closed */ + g_return_val_if_fail (priv->closed == FALSE, FALSE); + + return TRUE; +} + +/** + * gdk_pixbuf_loader_get_pixbuf: + * @loader: A loader. + * + * Gets the GdkPixbuf that the loader is currently loading. If the loader + * hasn't been enough data via gdk_pixbuf_loader_write, then NULL is returned. + * Any application using this function should check for this value when it is + * used. The pixbuf returned will be the same in all future calls to the + * loader, so simply calling a gdk_pixbuf_ref() should be sufficient to continue + * using it. + * + * Return value: The GdkPixbuf that the loader is loading. + **/ +GdkPixbuf * +gdk_pixbuf_loader_get_pixbuf (GdkPixbufLoader *loader) +{ + GdkPixbufLoaderPrivate *priv; + + g_return_val_if_fail (loader != NULL, NULL); + g_return_val_if_fail (GDK_IS_PIXBUF_LOADER (loader), NULL); + priv = loader->private; + + return priv->pixbuf; +} + +/** + * gdk_pixbuf_loader_close: + * @loader: A loader. + * + * Tells the loader to stop accepting writes + * + **/ +void +gdk_pixbuf_loader_close (GdkPixbufLoader *loader) +{ + GdkPixbufLoaderPrivate *priv; + + g_return_if_fail (loader != NULL); + g_return_if_fail (GDK_IS_PIXBUF_LOADER (loader)); + + priv = loader->private; + + /* we expect it's not closed */ + g_return_if_fail (priv->closed == FALSE); + priv->closed = TRUE; +} + diff --git a/gdk-pixbuf/gdk-pixbuf-loader.h b/gdk-pixbuf/gdk-pixbuf-loader.h new file mode 100644 index 0000000000..81ba0f58b7 --- /dev/null +++ b/gdk-pixbuf/gdk-pixbuf-loader.h @@ -0,0 +1,79 @@ +/* GdkPixbuf library - Main header file + * + * Copyright (C) 1999 The Free Software Foundation + * + * Authors: Mark Crichton + * Miguel de Icaza + * Federico Mena-Quintero + * Jonathan Blandford + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef GDK_PIXBUF_LOADER_H +#define GDK_PIXBUF_LOADER_H + +#include +#include +#include "gdk-pixbuf.h" + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif + + + +#define GDK_TYPE_PIXBUF_LOADER (gtk_pixbuf_get_type ()) +#define GDK_PIXBUF_LOADER (obj) (GTK_CHECK_CAST ((obj), GTK_TYPE_HBOX, GtkHBox)) +#define GDK_PIXBUF_LOADER_CLASS (klass) (GTK_CHECK_CLASS_CAST ((klass), GTK_TYPE_HBOX, GtkHBoxClass)) +#define GDK_IS_PIXBUF_LOADER (obj) (GTK_CHECK_TYPE ((obj), GTK_TYPE_HBOX)) +#define GDK_IS_PIXBUF_LOADER_CLASS (klass) (GTK_CHECK_CLASS_TYPE ((klass), GTK_TYPE_HBOX)) + + +typedef struct _GdkPixbufLoader GdkPixbufLoader; +struct _GdkPixbufLoader +{ + GtkObject object; + + /* < Private > */ + gpointer data; +}; + +typedef struct _GdkPixbufLoaderClass GdkPixbufLoaderClass; +struct _GdkPixbufLoaderClass { + GtkObjectClass parent_class; +#if 0 + /* If it get's implemented */ + void (* area_updated) (GdkPixbufLoader *loader, + int x, int y, int width, int height); +#endif +}; + + + +GtkObject *gdk_pixbuf_loader_new (void); +gboolean gdk_pixbuf_loader_write (GdkPixbufLoader *loader, gchar *buf, size_t count); +GdkPixbuf *gdk_pixbuf_loader_get_pixbuf (GdkPixbufLoader *loader); +void gdk_pixbuf_loader_close (GdkPixbufLoader *loader); + + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/gdk-pixbuf/gdk-pixbuf.h b/gdk-pixbuf/gdk-pixbuf.h index f9d2ce7292..ec42cf3eae 100644 --- a/gdk-pixbuf/gdk-pixbuf.h +++ b/gdk-pixbuf/gdk-pixbuf.h @@ -31,6 +31,7 @@ #ifdef __cplusplus extern "C" { +#pragma } #endif @@ -66,6 +67,7 @@ GdkPixbuf *gdk_pixbuf_new_from_data (guchar *data, ArtPixFormat format, gboolean ArtDestroyNotify dfunc, gpointer dfunc_data); GdkPixbuf *gdk_pixbuf_new_from_xpm_data (const gchar **data); + /* Transformations */ #if 0 GdkPixbuf *gdk_pixbuf_scale (const GdkPixbuf *pixbuf, gint w, gint h); diff --git a/gtk/gdk-pixbuf-loader.c b/gtk/gdk-pixbuf-loader.c new file mode 100644 index 0000000000..9dc57f45a1 --- /dev/null +++ b/gtk/gdk-pixbuf-loader.c @@ -0,0 +1,190 @@ +/* GdkPixbuf library - Main header file + * + * Copyright (C) 1999 The Free Software Foundation + * + * Authors: Mark Crichton + * Miguel de Icaza + * Federico Mena-Quintero + * Jonathan Blandford + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "gdk-pixbuf-loader.h" + + +static GtkObjectClass *parent_class; + +static void gdk_pixbuf_loader_class_init (GdkPixbufLoaderClass *klass); +static void gdk_pixbuf_loader_init (GdkPixbufLoader *loader); +static void gdk_pixbuf_loader_destroy (GdkPixbufLoader *loader); +static void gdk_pixbuf_loader_finalize (GdkPixbufLoader *loader); + +/* Internal data */ +typedef struct _GdkPixbufLoaderPrivate GdkPixbufLoaderPrivate; +struct _GdkPixbufLoaderPrivate +{ + GdkPixbuf *pixbuf; + gboolean closed; +}; + +GtkType +gdk_pixbuf_loader_get_type (void) +{ + static GtkType loader_type = 0; + + if (!loader_type) { + static const GtkTypeInfo loader_info = { + "GdkPixbufLoader", + sizeof (GdkPixbufLoader), + sizeof (GdkPixbufLoaderClass), + (GtkClassInitFunc) gdk_pixbuf_loader_class_init, + (GtkObjectInitFunc) gdk_pixbuf_loader_init, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL, + }; + + loader_type = gtk_type_unique (GTK_TYPE_OBJECT, &loader_info); + } + + return loader_type; +} + +static void +gdk_pixbuf_loader_class_init (GdkPixbufLoaderClass *klass) +{ + parent_class = GTK_OBJECT_CLASS (klass); + + parent_class->destroy = gdk_pixbuf_loader_destroy; + parent_class->finalize = gdk_pixbuf_loader_finalize; +} + +static void +gdk_pixbuf_loader_init (GdkPixbufLoader *loader) +{ + GdkPixbuf *pixbuf; + loader->private = g_new (GdkPixbufLoaderPrivate, 1); + + loader->pixbuf = NULL; + loader->closed = FALSE; +} + +static void +gdk_pixbuf_loader_destroy (GdkPixbufLoader *loader) +{ + GdkPixbufLoaderPrivate *priv; + + priv = loader->private; + gdk_pixbuf_unref (priv->pixbuf); +} + +static void +gdk_pixbuf_loader_finalize (GdkPixbufLoader *loader) +{ + GdkPixbufLoaderPrivate *priv; + + priv = loader->private; + g_free (priv); +} + +/* Public functions */ +GtkObject * +gdk_pixbuf_loader_new (void) +{ + GdkPixbufLoader *loader; + + loader = gtk_type_new (gdk_pixbuf_loader_get_type ()); + + return GTK_OBJECT (loader); +} + +/** + * gdk_pixbuf_loader_write: + * @loader: A loader. + * @buf: The image data. + * @count: The length of @buf in bytes. + * + * This will load the next @size bytes of the image. It will return TRUE if the + * data was loaded successfully, and FALSE if an error occurred. In this case, + * the loader will be closed, and will not accept further writes. + * + * Return value: Returns TRUE if the write was successful -- FALSE if the loader + * cannot parse the buf. + **/ +gboolean +gdk_pixbuf_loader_write (GdkPixbufLoader *loader, gchar *buf, size_t count) +{ + GdkPixbufLoaderPrivate *priv; + + g_return_val_if_fail (loader != NULL, FALSE); + g_return_val_if_fail (GDK_IS_PIXBUF_LOADER (loader), FALSE); + + priv = loader->private; + + /* we expect it's not to be closed */ + g_return_val_if_fail (priv->closed == FALSE, FALSE); + + return TRUE; +} + +/** + * gdk_pixbuf_loader_get_pixbuf: + * @loader: A loader. + * + * Gets the GdkPixbuf that the loader is currently loading. If the loader + * hasn't been enough data via gdk_pixbuf_loader_write, then NULL is returned. + * Any application using this function should check for this value when it is + * used. The pixbuf returned will be the same in all future calls to the + * loader, so simply calling a gdk_pixbuf_ref() should be sufficient to continue + * using it. + * + * Return value: The GdkPixbuf that the loader is loading. + **/ +GdkPixbuf * +gdk_pixbuf_loader_get_pixbuf (GdkPixbufLoader *loader) +{ + GdkPixbufLoaderPrivate *priv; + + g_return_val_if_fail (loader != NULL, NULL); + g_return_val_if_fail (GDK_IS_PIXBUF_LOADER (loader), NULL); + priv = loader->private; + + return priv->pixbuf; +} + +/** + * gdk_pixbuf_loader_close: + * @loader: A loader. + * + * Tells the loader to stop accepting writes + * + **/ +void +gdk_pixbuf_loader_close (GdkPixbufLoader *loader) +{ + GdkPixbufLoaderPrivate *priv; + + g_return_if_fail (loader != NULL); + g_return_if_fail (GDK_IS_PIXBUF_LOADER (loader)); + + priv = loader->private; + + /* we expect it's not closed */ + g_return_if_fail (priv->closed == FALSE); + priv->closed = TRUE; +} + diff --git a/gtk/gdk-pixbuf-loader.h b/gtk/gdk-pixbuf-loader.h new file mode 100644 index 0000000000..81ba0f58b7 --- /dev/null +++ b/gtk/gdk-pixbuf-loader.h @@ -0,0 +1,79 @@ +/* GdkPixbuf library - Main header file + * + * Copyright (C) 1999 The Free Software Foundation + * + * Authors: Mark Crichton + * Miguel de Icaza + * Federico Mena-Quintero + * Jonathan Blandford + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef GDK_PIXBUF_LOADER_H +#define GDK_PIXBUF_LOADER_H + +#include +#include +#include "gdk-pixbuf.h" + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif + + + +#define GDK_TYPE_PIXBUF_LOADER (gtk_pixbuf_get_type ()) +#define GDK_PIXBUF_LOADER (obj) (GTK_CHECK_CAST ((obj), GTK_TYPE_HBOX, GtkHBox)) +#define GDK_PIXBUF_LOADER_CLASS (klass) (GTK_CHECK_CLASS_CAST ((klass), GTK_TYPE_HBOX, GtkHBoxClass)) +#define GDK_IS_PIXBUF_LOADER (obj) (GTK_CHECK_TYPE ((obj), GTK_TYPE_HBOX)) +#define GDK_IS_PIXBUF_LOADER_CLASS (klass) (GTK_CHECK_CLASS_TYPE ((klass), GTK_TYPE_HBOX)) + + +typedef struct _GdkPixbufLoader GdkPixbufLoader; +struct _GdkPixbufLoader +{ + GtkObject object; + + /* < Private > */ + gpointer data; +}; + +typedef struct _GdkPixbufLoaderClass GdkPixbufLoaderClass; +struct _GdkPixbufLoaderClass { + GtkObjectClass parent_class; +#if 0 + /* If it get's implemented */ + void (* area_updated) (GdkPixbufLoader *loader, + int x, int y, int width, int height); +#endif +}; + + + +GtkObject *gdk_pixbuf_loader_new (void); +gboolean gdk_pixbuf_loader_write (GdkPixbufLoader *loader, gchar *buf, size_t count); +GdkPixbuf *gdk_pixbuf_loader_get_pixbuf (GdkPixbufLoader *loader); +void gdk_pixbuf_loader_close (GdkPixbufLoader *loader); + + + +#ifdef __cplusplus +} +#endif + +#endif -- 2.30.2